﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;

//----------------------------------------------------------------*/
// 版权所有：
// 文 件 名：WindowViewModelBase.cs
// 功能描述：
// 创建标识：m.sh.lin0328@163.com 2014/7/22 21:30:27
// 修改描述：
//----------------------------------------------------------------*/
namespace MslDiary.ViewModel
{
    //public class ViewModelBase : INotifyPropertyChanged, IDisposable
    //{
    //    public event PropertyChangedEventHandler PropertyChanged;
    //    public bool IsInDesignMode;
    //    /// <summary>  
    //    /// 显示名称  
    //    /// </summary>  
    //    public virtual string DisplayName { get; protected set; }
    //    /// <summary>  
    //    /// 触发属性发生变更事件  
    //    /// </summary>  
    //    /// <typeparam name="T">泛型标记，会匹配函数返回类型，不必手动填写</typeparam>  
    //    /// <param name="action">以函数表达式方式传入属性名称，表达式如下即可：()=>YourViewModelProperty</param>  
    //    //protected void OnPropertyChanged<T>(Expression<Func<T>> action)
    //    //{
    //    //    var propertyName = GetPropertyName(action);
    //    //    OnPropertyChanged(propertyName);
    //    //}
    //    //private static string GetPropertyName<T>(Expression<Func<T>> action)
    //    //{
    //    //    var expression = (MemberExpression)action.Body;
    //    //    var propertyName = expression.Member.Name;
    //    //    return propertyName;
    //    //}  

    //    #region 构造

    //    public ViewModelBase()
    //    {

    //    }
    //    #endregion

    //    #region 命令
    //    #endregion
    //    private void OnPropertyChanged(string propertyName)
    //    {
    //        if (this.PropertyChanged != null)
    //        {
    //            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    //        }
    //    }

    //    #region 支持.NET4.5
    //    //protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
    //    //{
    //    //    if (object.Equals(storage, value)) { return false; }
    //    //    storage = value;
    //    //    this.OnPropertyChanged(propertyName);
    //    //    return true;
    //    //}
    //    //private void OnPropertyChanged([CallerMemberName] string propertyName = null)
    //    //{
    //    //    var eventHandler = this.PropertyChanged;
    //    //    if (eventHandler != null)
    //    //    {
    //    //        eventHandler(this, new PropertyChangedEventArgs(propertyName));
    //    //    }
    //    //}
    //    #endregion

    //    #region 支持.NET4.0

    //    private static string GetProperyName(string methodName)
    //    {
    //        if (methodName.StartsWith("get_") || methodName.StartsWith("set_") ||
    //            methodName.StartsWith("put_"))
    //        {
    //            return methodName.Substring(4);
    //        }
    //        throw new Exception(methodName + " not a method of Property");
    //    }

    //    protected void SetProperty<T>(ref T name, T value)
    //    {
    //        if (object.Equals(name, value)) return;
    //        name = value;
    //        string propertyName = GetProperyName(new System.Diagnostics.StackTrace(true).GetFrame(1).GetMethod().Name);
    //        this.OnPropertyChanged(propertyName);
    //    }

    //    #endregion

    //    #region IDisposable Members
    //    public void Dispose()
    //    {
    //        this.OnDispose();
    //    }
    //    /// <summary>  
    //    /// 若支持IDisposable，请重写此方法，当被调用Dispose时会执行此方法。  
    //    /// </summary>  
    //    protected virtual void OnDispose()
    //    {
    //    }
    //    #endregion
    //}
    public class CommandBase : System.Windows.Input.ICommand
    {
        private Action<Object> _doWork;
        private readonly Func<object, bool> _canExecute;

        /// <summary>  
        /// 实例化一个CommandBase对象  
        /// </summary>  
        /// <param name="doWork">委托一个有object类型参数的命令执行函数</param>  
        /// <param name="canExecute">委托一个有object类型参数的命令是否能被执行的函数（可选）</param>  
        /// <exception cref="ArgumentNullException">参数command不可以为null引用</exception>  
        public CommandBase(Action<object> doWork, Func<object, bool> canExecute = null)
        {
            if (doWork == null)
                throw new ArgumentNullException("doWork");

            _canExecute = canExecute;
            _doWork = doWork;
        }
        public bool CanExecute(Object parameter)
        {
            return true;
        }
        public void Execute(Object parameter)
        {
            if (this._doWork != null)
                this._doWork(parameter);
        }
        public event EventHandler CanExecuteChanged
        {
            add { }
            remove { }
        }
    }
}
